package coop.tecso.modelo1.util;

import java.lang.reflect.Field;
import java.util.Iterator;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

public class OgnlNavigator{

	
	public OgnlNavigator(){
		
	}
	
	/**
	 * @METHOD: traer un objeto, buscar por CBU
	 * 
	 * @result: imprime por pantalla todos los campos.
	 * 
	 */

	public void findByKey(OgnlContext contexto, String key) throws OgnlException {
		Object objectResult = contexto.get(key);
		if (objectResult != null){
			System.out.println("Class: "+objectResult.getClass().getSimpleName().toString());
		}
		Field[] listFields = objectResult.getClass().getDeclaredFields();
		for (Field field : listFields) {
				try {
					objectResult.getClass().getField(field.getName()).getType();
					String expression = key + "." + field.getName();
					Object exp = Ognl.parseExpression(expression);
					Object result = Ognl.getValue(exp, contexto);
					System.out.println("   "+field.getName() + ": " + result);
				} catch (Exception e) {
					//e.printStackTrace(); //TODO: funciona. pero lanza exceptions para los tipos: banco,usuario,cuentas,historicos.
				}
			
		}
		}
	

	
	/**
	 * @param CollectionElementsAccessor 
	 * @METHOD: traer un objeto, buscar por valor de campo seleccionado
	 * 
	 * @result: imprime por pantalla todos los campos con todas las cuentas.
	 * 
	 */
	
	public void findByField(OgnlContext contexto, String field, String value)
			throws OgnlException {
		
		Iterator itr = contexto.keySet().iterator();
		
		while (itr.hasNext()) {
			try {
				String key = itr.next().toString();
				String expression = key+"."+field + " == " + value;
				Object exp = Ognl.parseExpression(expression);
				Object result = (Boolean) Ognl.getValue(exp, contexto);
				if ((Boolean) result) {
					OgnlNavigator newOgnlFind = new OgnlNavigator();
					newOgnlFind.findByKey(contexto, key);
				}
			} catch (OgnlException e) {
				//e.printStackTrace(); //TODO lanza expecion al no encontrar el campo en el objeto Usuario y Banco
			}

		}

	}



	/**
	 * @METHOD: traer todos las objetos
	 * 
	 * @result: imprime por pantalla todos los campos con todas las cuentas.
	 * 
	 */

	public void findAllObjects(OgnlContext contexto) throws OgnlException{
		Iterator itr = contexto.keySet().iterator();				
		while (itr.hasNext()) {
			try{
				String key = itr.next().toString();
				OgnlNavigator newOgnlFind = new OgnlNavigator();
				newOgnlFind.findByKey(contexto, key);
				System.out.println();
			} catch (OgnlException e) {
				e.printStackTrace();
			}

		}
		

		
		
	}
	
	
	

}
